var BASE_DIR = __dirname+'/../';
var UTIL= BASE_DIR+'util/';

var DateUtil = require(UTIL+'DateUtil');
var SerialGenerator = require(UTIL+'SerialGenerator');

module.exports = PrepayService;

function PrepayService(argument) {
  this.doService = function(orderBean) {
    // 1.校验报文
    validateParam(orderBean);
    // 2.组装支付请求报文
    var xmldata = setReqXml(orderBean);
    // 3.签名
    var iSign = SignFactory.getInstance(ConfUtil.get("sign.util.class.name"));
    xmldata = iSign.sign(xmldata);
  };

  function validateParam(orderBean) {
    // 订单编号
    if (orderBean.getOrderNo() === null || '' === orderBean.getOrderNo() || 32 != orderBean.getOrderNo().length) {
      throw new Error('参数orderNo校验失败，收到的数据为:' + orderBean.getOrderNo());
    }

    // 买家ID
    var buyerId = orderBean.getBuyerId() === null ? '' : orderBean.getBuyerId();
    orderBean.setBuyerId(buyerId);
    if (32 < orderBean.getBuyerId().length) {
      throw new Error('参数buyerId校验失败，收到的数据为:' + orderBean.getBuyerId());
    }
    // 手机号段类型
    var idType = orderBean.getIdType() === null ? '' : orderBean.getIdType();
    orderBean.setIdType(idType);
    if (idType !== '' && '01' !== orderBean.getIdType() && '05' !== orderBean.getIdType()) {
      throw new Error('参数IdType校验失败，收到的数据为:' + orderBean.getIdType());
    }

    //手机号码
    var idValue = orderBean.getIdValue() === null ? '' : orderBean.getIdValue();
    orderBean.setIdValue(idValue);

    // 订单金总额
    if (orderBean.getOrderMoney() === null || orderBean.getOrderMoney() === '' || 9 < orderBean.getOrderMoney().length) {
      throw new Error('参数orderMoney校验失败，收到的数据为:' + orderBean.getOrderMoney());
    }

    // 商户赠送金额
    if (orderBean.getGift() === null || orderBean.getGift() === '' || 9 < orderBean.getGift().length) {
      throw new Error('参数gift校验失败，收到的数据为:' + orderBean.getGift());
    }

    // 商户活动编号
    var merActivityId = orderBean.getMerActivityId() === null ? '' : orderBean.getMerActivityId();
    orderBean.setMerActivityId(merActivityId);
    if (32 < orderBean.getMerActivityId().length) {
      throw new Error('参数merActivityId校验失败，收到的数据为:' + orderBean.getMerActivityId());
    }

    // 支付方式
    if (orderBean.getPaymentType() === null && orderBean.getPaymentType() === '' && 32 < orderBean.getPaymentType().length) {
      throw new Error('参数paymentType校验失败，收到的数据为:' + orderBean.getPaymentType());
    }

    // 支付限制
    var paymentLimit = orderBean.getPaymentLimit() === null ? '' : orderBean.getPaymentLimit();
    orderBean.setPaymentLimit(paymentLimit);
    if (32 < orderBean.getPaymentLimit().length) {
      throw new Error('参数PaymentLimit校验失败，收到的数据为:' + orderBean.getPaymentLimit());
    }

    // 产品编号
    if (orderBean.getProductId() === null || orderBean.getProductId() === '' || 32 < orderBean.getProductId().length) {
      throw new Error('参数productId校验失败，收到的数据为:' + orderBean.getProductId());
    }

    // 产品名称
    if (orderBean.getProductName() === null || orderBean.getProductName() === '' || 32 < orderBean.getProductName().length) {
      throw new Error('参数productName校验失败，收到的数据为:' + orderBean.getProductName());
    }

    // 产品描述
    if (orderBean.getProductDesc() === null || orderBean.getProductDesc() === '' || 32 < orderBean.getProductDesc().length) {
      throw new Error('参数productDesc校验失败，收到的数据为:' + orderBean.getProductDesc());
    }

    // 产品展示地址
    if (orderBean.getPaymentType().startsWith('UNIONPAY-GATEWAY')) {
      if (orderBean.getProductUrl() === null || orderBean.getProductUrl() === '') {
        throw new Error('参数productUrl校验失败，收到的数据为:' + orderBean.getProductUrl());
      }
    }
    // 订单结果通知
    if (orderBean.getNotifyUrl() === null || orderBean.getNotifyUrl() === '') {
      throw new Error('参数notifyUrl校验失败，收到的数据为:' + orderBean.getNotifyUrl());
    }

    // 客户端IP
    var clientIp = orderBean.getClientIp() === null ? '' : orderBean.getClientIp();
    orderBean.setClientIp(clientIp);
    if (15 < orderBean.getClientIp().length) {
      throw new Error('参数clientIp校验失败，收到的数据为:' + orderBean.getClientIp());
    }

    //支付成功同步跳转返回页面URL
    var returnUrl = orderBean.getReturnUrl() === null ? '' : orderBean.getReturnUrl();
    orderBean.setReturnUrl(returnUrl);
    if (orderBean.getPaymentType().startsWith('UNIONPAY-GATEWAY')) {
      if (orderBean.getReturnUrl() === null || orderBean.getReturnUrl() === '') {
        throw new Error('参数returnURL校验失败，收到的数据为:' + orderBean.getReturnUrl());
      }
    }

    //商户自定义参数
    var customParam = orderBean.getCustomParam() === null ? '' : orderBean.getCustomParam();
    orderBean.setCustomParam(customParam);
    if (1024 < orderBean.getCustomParam().length) {
      throw new Error('参数customParam校验失败，收到的数据为:' + orderBean.getCustomParam());
    }

    var weiXinAppId = orderBean.getWeiXinAppId() === null ? '' : orderBean.getWeiXinAppId();
    orderBean.setWeiXinAppId(weiXinAppId);
    if (orderBean.getPaymentType().startsWith('WEIXIN')) {
      // 微信公众号ID
      if (orderBean.getWeiXinAppId() === null || orderBean.getWeiXinAppId().trim().equals('') || 32 < orderBean.getWeiXinAppId().length) {
        throw new Error('参数weixinAppId校验失败，收到的数据为:' + orderBean.getWeiXinAppId());
      }
    }
    var weiXinOpenId = orderBean.getWeiXinOpenId() === null ? '' : orderBean.getWeiXinOpenId();
    orderBean.setWeiXinOpenId(weiXinOpenId);
    // 微信用户标识 WEIXIN-JSAPI时，此字段必填
    if (orderBean.getPaymentType() === 'WEIXIN-JSAPI') {
      // 微信用户标识
      if (orderBean.getWeiXinOpenId() === null || orderBean.getWeiXinOpenId() === '' || 128 < orderBean.getWeiXinOpenId().length) {
        throw new Error('参数weixinOpenId校验失败，收到的数据为:' + orderBean.getWeiXinOpenId());
      }
    }
  }

  function setReqXml(orderBean) {
    var  xmldata = ''.concat("<?xml version='1.0' encoding='UTF-8'?>").concat("<GPay>")
        .concat("<Header>")
        .concat("<ActivityCode>").concat("U101_001").concat("</ActivityCode>")// 交易代码
        .concat("<ReqSys>").concat(orderBean.getOrderNo().substring(0, 4)).concat("</ReqSys>")// 发起方系统
        .concat("<ReqDate>").concat(DateUtil.getMonth()).concat("</ReqDate>")// 发起方日期
        .concat("<ReqTransID>").concat(DateUtil.getMinute() + SerialGenerator.generateRandomSerial(20))
        .concat("</ReqTransID>")// 发起方交易流水
        .concat("<ReqDateTime>").concat(DateUtil.getCurrentDateTimeSec()).concat("</ReqDateTime>")// 发起方时间戳
        .concat("<ActionCode>").concat("REQ").concat("</ActionCode>")
        .concat("<RcvSys>").concat("0001").concat("</RcvSys>")
        .concat("</Header>")
        .concat("<Body>")
        .concat("<OrderNo>").concat(orderBean.getOrderNo()).concat("</OrderNo>")
        .concat("<BuyerID>").concat(orderBean.getBuyerId()).concat("</BuyerID>")
        .concat("<IDType>").concat(orderBean.getIdType()).concat("</IDType>")
        .concat("<IDValue>").concat(orderBean.getIdValue()).concat("</IDValue>")
        .concat("<OrderMoney>").concat(orderBean.getOrderMoney()).concat("</OrderMoney>")
        .concat("<Payment>").concat(orderBean.getPayment()).concat("</Payment>")
        .concat("<Gift>").concat(orderBean.getGift()).concat("</Gift>")
        .concat("<MerActivityID>").concat(orderBean.getMerActivityId()).concat("</MerActivityID>")
        .concat("<PaymentType>").concat(orderBean.getPaymentType()).concat("</PaymentType>")
        .concat("<PaymentLimit>").concat(orderBean.getPaymentLimit()).concat("</PaymentLimit>")
        .concat("<ProductID>").concat(orderBean.getProductId()).concat("</ProductID>")
        .concat("<ProductName>").concat(orderBean.getProductName()).concat("</ProductName>")
        .concat("<ProductDesc>").concat(orderBean.getProductDesc()).concat("</ProductDesc>")
        .concat("<ProductURL>").concat(orderBean.getProductUrl()).concat("</ProductURL>")
        .concat("<NotifyURL>").concat(orderBean.getNotifyUrl()).concat("</NotifyURL>")
        .concat("<ReturnURL>").concat(orderBean.getReturnUrl()).concat("</ReturnURL>")
        .concat("<ClientIP>").concat(orderBean.getClientIp()).concat("</ClientIP>")
        .concat("<CustomParam>").concat(orderBean.getCustomParam()).concat("</CustomParam>")
        .concat("<WeiXinAppId>").concat(orderBean.getWeiXinAppId()).concat("</WeiXinAppId>")
        .concat("<WeiXinOpenId>").concat(orderBean.getWeiXinOpenId()).concat("</WeiXinOpenId>")
        .concat("</Body>")
        .concat("<Sign>")
        .concat("<CerID>")
        .concat("</CerID>")
        .concat("<SignValue>")
        .concat("</SignValue>")
        .concat("</Sign>")
        .concat("</GPay>");

    return xmldata;
  }

  function send() {

  }
}
